#include <stdio.h>

//指针不光可以指变量，还可以指函数
//函数被放在计算机内存分区中的代码段里
//函数在代码段里拥有自己的位置，就是函数地址

#if 1
    int add(int a, int b)
    {
        return a + b;
    }

    int minus(int a, int b)
    {
        return a - b;
    }

    void func(int(*p)(int, int), int a, int b)  //回调函数（说白了就是函数指针，把函数作为参数传入另外一个函数进行调用，它的作用就是，同一个函数可以表现不同的功能）
    {
        printf("%d\n",p(a, b));
    }
#endif

int* func() //指针函数：返回值是指针的函数  不能返回局部变量的地址（因为局部变量在函数结束时就销毁释放了）
{
    //int a = 0;        //这样定义后将a的地址传给p是不行的，因为这个函数在结束时就销毁释放了，那么指针p指向的内存也就不存在了，所以p会变成一个野指针
    static int a = 0;   //所以可以找生命周期长的变量 
    return &a;
}

int main()
{
#if 0
    //声明一个函数指针 p，它指向一个接受 int 参数并返回 void 的函数
    void(*p)(int) = func;    //函数指针：指向一个函数的指针
    void(*p)(int) = &func;   //两种写法，没有区别（函数名称就是函数地址，取函数的地址还是函数地址）
    p(1);   //传参1
#endif

#if 0
    func(add, 1, 2);
    func(minus, 1, 2);
    //同样的函数，调用同样的代码，出现的结果不一样，也就是说，在没有修改这个函数的情况下，改变了这个函数的功能，原因就是，连同函数本身作为参数传进去了，这种用法称为回调函数
#endif

    return 0;
}